package ctrl;

import om.Bewertung;
import om.Bilder;
import om.Orte;
import om.Region;
import om.Route;

import org.apache.log4j.Logger;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;


import dao.BewertungDao;
import dao.BilderDao;
import dao.DaoException;
import dao.OrteDao;
import dao.RegionDao;
import dao.RouteDao;

@Controller
public class RouteCtrl {
	private static Logger log = Logger.getLogger(RouteCtrl.class);
	private RouteDao	 routeDao 		= null;
	private OrteDao 	 orteDao 		= null;
	private BewertungDao bewertungDao 	= null;
	private BilderDao    bilderDao 		= null;
	private RegionDao 	 regionDao 		= null;
	

	public void setRegionDao(RegionDao regionDao) {
		this.regionDao = regionDao;
	}
	public void setRouteDao(RouteDao routeDao) {
		this.routeDao = routeDao;
	}
	public void setOrteDao(OrteDao orteDao){
		this.orteDao = orteDao;
	}
    public void setBewertungDao(BewertungDao bewertungDao) {
		this.bewertungDao = bewertungDao;
	}
	public void setBilderDao(BilderDao bilderDao) {
		this.bilderDao = bilderDao;
	}
	
	/**
     * <p> Routen eines Ortes werden aufgelistet  </p>
     * 
     * <p>Erwartet HTTP GET und request '/RoutenOrte.html'</p>
     * @return 
     */
	
	@RequestMapping(value="/RoutenOrte.html", method=RequestMethod.GET)
    public ModelAndView getRoutenOrte() {
    	log.info("welcome");
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Auswahl der Routen in den Orten, in den Sie wandern m�chten: ");
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.addObject("routen", routeDao.getRouteOrt());
		mv.setViewName("list-route-ort");
		return mv;
    }
	
	/**
     * <p>Routen mit Orten werden aufgelistet </p>
     * 
     * <p>Erwartet HTTP GET und request '/RoutenvonOrt.html'</p>
     * @return 
     */
	@RequestMapping(value="/RoutenvonOrt.html", method=RequestMethod.GET)
	public ModelAndView getRoutenByOrt(@RequestParam(required=false) Integer id) {
		log.info("route by id");
		ModelAndView mv = new ModelAndView();
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.addObject("title", "Auswahl der Routen, welche Sie wandern m�chten: ");
		mv.addObject("routen", routeDao.findRouteByOrt(id));
		mv.setViewName("list-routen");
		return mv;
	}
	/**
     * <p>Eine Route wird angelegt</p>
     * 
     * <p>Erwartet HTTP GET und request '/EditRoute.html'</p>
     * @return 
     */
	@RequestMapping(value="/EditRoute.html", method=RequestMethod.GET)
	public ModelAndView edit(@RequestParam(required=false) Integer id){
	
		
		log.debug("EditRoute.html");
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Bitte f�llen Sie alle Felder aus, sonst kann die Route nicht angelegt werden.");
		if (id == null){
			mv.addObject(new Route());
		} else {
			mv.addObject(routeDao.findById(id));
		}
		mv.addObject("orte", orteDao.getAllOrte());
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.setViewName("EditRoute");
		return mv;
	}
	/**
     * <p> Ergebnisse der Suchanfrage </p>
     * <p> Gesucht werden Regionen, Orte und Routen die den Suchbegriff enthalten </p>
     * <p>Erwartet HTTP GET und request '/suche.html'.</p>
     * @return 
     */
	@RequestMapping(value="/suche.html", method=RequestMethod.GET)
	public ModelAndView search(String suche) {
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Folgende Ergebnisse wurde durch Ihre Suchanfrage gefunden:");
		mv.addObject("routen", routeDao.findRouteBySearch(suche));
		mv.addObject("orte", orteDao.findOrteBySearch(suche));
		mv.addObject("regionen", regionDao.findRegionenBySearch(suche));
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.setViewName("search-ergebniss");
		return mv;
	}
	
	 /**
     * <p>Speichert eine Route</p>
     * 
     * <p>Erwartet HTTP POST und request '/SaveRoute.html'</p>
     * @return 
     */
	@RequestMapping(value="/SaveRoute.html", method=RequestMethod.POST)
	public String save(Route route, Integer ortid, Bewertung bewertung, Bilder bilder) {
				
		Route routeNeu = routeDao.save(route, ortid);
		bilderDao.save(bilder, route.getRouteid());
		bewertungDao.save(bewertung, route.getRouteid()); //mal abchecken weil save methode auf integer id ge�ndert
		return "redirect:AlleRouten.html";
	}
    /**
     * <p>Sucht nach allen Routen und stellt diese in einer
     * <code>Collection</code> dar </p>
     * 
     * <p>Erwartet HTTP GET und request '/AlleRouten.html'</p>
     */
    @RequestMapping(value="/AlleRouten.html", method=RequestMethod.GET)
    public ModelAndView getAll() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Alle Routen der Webseite:");
		mv.addObject("routen", routeDao.FindOrtBewertungRegionRoute());	
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.addObject("orte", orteDao.getAllOrte());
	//	mv.addObject("routen", routeDao.getAll());
		mv.setViewName("list-all-routen");
		return mv;
    }
    /**
     * <p>Sucht nach einer bestimmten Route und 
     * zeigt deren Region, den Ort , alle Bewertungen und alle Bilder dazu an </p>
     * 
     * <p>Erwartet HTTP GET und request '/Route.html'</p>
     */
    @RequestMapping(value="/Route.html", method=RequestMethod.GET)
    public ModelAndView getRoute(@RequestParam(required=true) Integer id) {
		ModelAndView mv = new ModelAndView();
		if (id == null){
			mv.addObject(new Bewertung());
		} 
		mv.addObject("bilder", bilderDao.getBilderByRoute(id));
		Route route = routeDao.findById(id);
		Orte orte = route.getFs_orteid();
		Region region = orte.getFs_regionid();
				
		mv.addObject("ortename", orte.getStadt());
		mv.addObject("regionname", region.getRegion());
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.addObject("route", routeDao.findById(id));
		mv.addObject("bewertungen", bewertungDao.getBewertungByRoute(id));
		mv.addObject("bewertungbylandschaft", bewertungDao.getLandschaftByRoute(id));
		mv.addObject("bewertungbyphysis", bewertungDao.getPhysisByRoute(id));
		mv.addObject("bewertungbytechnik", bewertungDao.getTechnikByRoute(id));
		
		mv.setViewName("view-route");
		return mv;
    }
    /**
     * <p>Sucht eine bestimmte Route und 
     * speichert eine Bewertung daf�r ab </p>
     * 
     * <p>Erwartet HTTP POST und request '/abgeben.html'</p>
     */
    @RequestMapping(value="/abgeben.html", method=RequestMethod.POST)
    public String save(@RequestParam(required=true) Integer routeid, Bewertung bewertung) {
        Bewertung result = bewertungDao.save(bewertung, routeid);
    	return "redirect:Route.html?id="+routeid;
    }
    /**
     * <p>Eine Route wird ge�ndert oder gel�scht </p>
     * <p>Erwartet HTTP GET und request '/delete-edit-route.html'</p>
     */
    @RequestMapping(value="/delete-edit-route.html", method=RequestMethod.GET)
    public ModelAndView displayAllforDelete() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Alle Routen der Webseite:");
		
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		mv.addObject("authorities", auth.getAuthorities());
		mv.addObject("principal", auth.getName());
		mv.addObject("routen", routeDao.getAll());	
		mv.addObject("edit", true);
		mv.setViewName("list-edit-delete-route");
		return mv;
    }
    /**
     * <p>L�scht eine Route,die dazugeh�rigen Bewertungen und die Bilder.</p>
     * 
     * <p>Erwartet HTTP GET und request '/LoescheRoute.html'.</p>
     */

    @RequestMapping(value="/LoescheRoute.html", method=RequestMethod.GET)
    public ModelAndView delete(Integer id) throws DaoException {
      
     
         try
         {
         bilderDao.delete(routeDao.findById(id));	 
         bewertungDao.delete(routeDao.findById(id));
         routeDao.delete(routeDao.findById(id));
         
  
         return new ModelAndView("redirect:AlleRouten.html");
         }
        
        catch (DaoException e)
        {
        	ModelAndView mv = new ModelAndView("error");
        	mv.addObject("message", e.getMessage());
        	return mv;
        }
        };
        

        /**
         * <p>Ladet ein Bild zu einer jeweiligen Route hoch</p>
         * 
         * <p>Erwartet HTTP POST und request '/uploadImage.html'.</p>
         */	
	@RequestMapping(value="/uploadImage.html", method=RequestMethod.POST)
	public String save (@RequestParam(required=true) Integer routeid,Bilder bilder) {

		  if (!bilder.getUrl().equals("")){
			   Bilder result = bilderDao.save(bilder, routeid);
			  }
		
		return "redirect:Route.html?id="+routeid;
	}
}

